package com.qy.StudentInfo.utils;

import com.qy.StudentInfo.pojo.SendEmailReq;
import com.sun.mail.util.MailSSLSocketFactory;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

@Service
public class CommonUtil {
    static Logger log = Logger.getLogger(CommonUtil.class);

    /**
     * 发送邮件方法
     */
    public boolean sendEmail(SendEmailReq sendEmailReq){
        try {
            log.info("邮件发送开始，参数："+sendEmailReq.toString());
            Properties prop = new Properties();
            prop.setProperty("mail.host",Constants.SERVERS);//设置邮件服务器
            prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
            prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码

            //关于QQ邮箱，还要设置sSL加密，加上以下代码即可，大厂，其他邮箱不需要！
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf. setTrustAllHosts(true);
            prop. put("mail.smtp.ssl.enable","true");
            prop. put("mail.smtp.ss1.socketFactory", sf);

            // 使用JavaMaiL发送邮件的5个步骤

            // 1、创建定义整个应用程序所需的环境信息的 Session对象

            // 使用QQ邮箱的时候才需要，其他邮箱不需要这一段代码
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                //获取和SMTP服务器的连接对象
                @Override
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication(Constants.EMAILSENDER, Constants.authorizationCode);
                }
            });

            // 2、通过session得到到Transport对象
            //通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象
            Transport ts = session.getTransport();

            // 3、使用邮箱的 '用户名'和'授权码' 连上 '邮件服务器'
            ts.connect(Constants.SERVERS, Constants.EMAILSENDER, Constants.authorizationCode);

            // 4、创建邮件:写邮件

            // 根据对象session 创建一个邮件对象
            MimeMessage message = new MimeMessage(session);
            //指明邮件的发件人——在网页上填写发件人
            message.setFrom(new InternetAddress(Constants.EMAILSENDER));//设置发件人
            //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发——在网页上填写收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(sendEmailReq.getReceiver()));//设置收件人
            //邮件的标题——在网页上填写邮件标题
            message.setSubject(sendEmailReq.getEmailTitle());//设置邮件主题

            // 编写'邮件内容'
            message.setContent(sendEmailReq.getEmailText(), Constants.EMAILTYPE);//设置邮件的具体内容
            message.saveChanges();

            // 5、发送邮件
            ts.sendMessage(message,message.getAllRecipients());
            // 6、关闭连接对象，即关闭服务器上的连接资源
            ts.close();
            log.info("邮件发送结束，成功发送邮件");
            return true;
        } catch (Exception e) {
            log.error("邮件发送失败:"+e.getMessage());
            e.printStackTrace();
            return false;
        }
    }
}
